package ar.edu.utn.frgp.banco.servlets;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import ar.edu.utn.frgp.banco.domain.PagoPrestamos;
import ar.edu.utn.frgp.banco.domain.Prestamo;
import ar.edu.utn.frgp.banco.domain.enums.OrigenFondos;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;
import ar.edu.utn.frgp.banco.exceptions.PersonalisedException;
import ar.edu.utn.frgp.banco.exceptions.ServiceException;
import ar.edu.utn.frgp.banco.service.PagoPrestamosService;
import ar.edu.utn.frgp.banco.service.PrestamoService;
import ar.edu.utn.frgp.banco.service.impl.PagoPrestamosServiceImpl;
import ar.edu.utn.frgp.banco.service.impl.PrestamoServiceImpl;
import ar.edu.utn.frgp.banco.utils.RequestConverterUtils;

/**
 * Servlet implementation class PrestamoServlet	
 */
public class PrestamoServlet extends SuperServlet {
	

	Prestamo prestamo;
	PagoPrestamos pagoPrestamo;
	Integer tipoPago;
	BigDecimal valorCuota;
	

	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public PrestamoServlet() {
    	
    }
    
    /************************** CREAR PRESTAMO - INICIO - ***********************/
    public String inicioCrearPrestamo(HttpServletRequest req, HttpServletResponse resp){
    	
    	return "/app/prestamos/crearPrestamo.jsp";
    }
    
    public String crearPrestamo(HttpServletRequest req, HttpServletResponse resp) throws ServiceException{
    	
    	PrestamoService prestamoServ = new PrestamoServiceImpl();
    	
    	prestamoServ.solicitarPrestamo(prestamo);
    	
    	return "/app/prestamos/prestamoOK.jsp";			
    }
    
    /************************** CREAR PRESTAMO - FIN - ***********************/
    
    
   /*********************** PAGAR PRESTAMOS - INICIO - ************************/ 
    public String inicioPagoPrestamos(HttpServletRequest req, HttpServletResponse resp){
    	try {
    			cargarPrestamo(req);
    			consultarCantCuotas(req);
    	    	consultarMontoCuotas(req);

		} catch (PersonalisedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
    	return "/app/prestamos/pagarPrestamo.jsp";
    }
    
  
     
    public String pagarCuota(HttpServletRequest req, HttpServletResponse resp) throws PersonalisedException{
    	//Funcion que realiza el pago de la cuota (al hacer submit a la pagina)

    	
    	if (!isPopulateOk()){
    		return inicioPagoPrestamos(req, resp);
    	}
    	
    	
    	
    	prestamo = new Prestamo();

    	PrestamoService prestamoServ = new PrestamoServiceImpl();
    	
    	PagoPrestamosService pagoPrestamoServ = new PagoPrestamosServiceImpl();
    	
    	prestamo = prestamoServ.consultarPrestamo(clienteActivo.getDni());
    	
    	pagoPrestamo.setId(prestamo.getId());
    	
    	try {
    		if(tipoPago == 1)
        		pagoPrestamoServ.pagarCuota(pagoPrestamo, valorCuota);
        	
        	if(tipoPago == 2)
        		pagoPrestamoServ.pagarCuotaEfectivo(pagoPrestamo, prestamo.getMonto());
			
        	return "/app/prestamos/prestamoOK.jsp";
        	
		} catch (ServiceException se) {
			// TODO: handle exception
			//addError("Su saldo es insuficiente para realizar el pago");
    		addError(se.getError());
    		inicioPagoPrestamos(req, resp);
    		return "/app/prestamos/pagarPrestamo.jsp";
		}
    	
    }
    

    
    private void consultarCantCuotas(HttpServletRequest req) throws PersonalisedException{
    	//Carga el request con la cantidad de cuotas
    	prestamo = new Prestamo();
    	
    	PrestamoService prestamoServ = new PrestamoServiceImpl();
    	
    	prestamo = prestamoServ.consultarPrestamo(clienteActivo.getDni());
    	
    	req.setAttribute("cuotas", prestamoServ.consultarCuotas(prestamo.getId()));
    }
    
    private void consultarMontoCuotas(HttpServletRequest req) throws PersonalisedException{
    	//carga el request con el valor de la cuota
    	prestamo = new Prestamo();
    	
    	PrestamoService prestamoServ = new PrestamoServiceImpl();
    	
    	prestamo = prestamoServ.consultarPrestamo(clienteActivo.getDni());
    	
    	double interes = (prestamo.getInteres().doubleValue() / 100) + 1;
    	
    	double res = prestamo.getMonto().doubleValue() * interes / prestamo.getCantidadCuotas();
    	
    	valorCuota = new BigDecimal(res);
    	
    	req.setAttribute("valorCuota", res);
    }

    private void cargarPrestamo(HttpServletRequest req) throws PersonalisedException{
    	
    	prestamo = new Prestamo();
		
		PrestamoService prestamoServ = new PrestamoServiceImpl();
    	
    	prestamo = prestamoServ.consultarPrestamo(clienteActivo.getDni());
    	
    	req.setAttribute("prestamo", prestamo);
    }
    
    
    /******************* PAGAR PRESTAMOS - FIN - ****************/
    
    /******************* ESTADO PRESTAMO - INICIO - ***************/
    
    public String inicioEstadoPrestamo(HttpServletRequest req, HttpServletResponse res){
	    try {
	    		
				cargarPrestamo(req);
				consultarCantCuotas(req);
		    	consultarMontoCuotas(req);
		    	estadoPrestamo(req);
	
		} catch (PersonalisedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    
    	return "/app/prestamos/estadoPrestamo.jsp";
    }
    
    private void estadoPrestamo(HttpServletRequest req) throws DataAccessException{
    	prestamo = new Prestamo();
		
		PrestamoService prestamoServ = new PrestamoServiceImpl();
    	
    	if(prestamoServ.esActivo(clienteActivo.getDni()))
    		req.setAttribute("estado", "Activo");
    	else
    		req.setAttribute("estado", "Finalizado");
    }
    /***************** ESTADO PRESTAMO - FIN - ********************/

	@Override
	public boolean populate(HttpServletRequest req)  {
		// TODO Auto-generated method stub
		
		// CARGAR EL PRESTAMO
		boolean devolver = true;
		Date date = new Date();
		
		prestamo = new Prestamo();
		
		prestamo.setDni(clienteActivo.getDni());

		if(clienteActivo.getCuentasCorrientes()!= null && !clienteActivo.getCuentasCorrientes().isEmpty() || clienteActivo.getCajaAhorro() != null){
			
			prestamo.setInteres(BigDecimal.valueOf(10));
		}
		else{
			prestamo.setInteres(BigDecimal.valueOf(15));
		}

		prestamo.setFechaAlta(date);
		
		
		if(req.getParameter("monto")!= null){
			if (RequestConverterUtils.canConvertBigDecimal(req, "monto")){
				
				double mon = (RequestConverterUtils.convertBigDecimal(req, "monto")).doubleValue();
				
				if (mon < 5000){
					devolver = false;
					addAdvertencia("El monto minimo para solicitar un prestamo es $5000.");
				}
				
				prestamo.setMonto(RequestConverterUtils.convertBigDecimal(req, "monto"));
			} else {
				addAdvertencia("El formato del campo monto no es el adecuando.");
				devolver = false;
			}
		}
		if(req.getParameter("cuotas")!= null){
			if (RequestConverterUtils.canConvertInteger(req, "cuotas")){
				prestamo.setCantidadCuotas(RequestConverterUtils.convertInteger(req, "cuotas"));
			} else {
				addAdvertencia("El formato del campo cuotas no es el adecuando.");
				devolver = false;
			}
		}
		
		//CARGAR PAGO PRESTAMOS
		pagoPrestamo = new PagoPrestamos();
		
		pagoPrestamo.setDni(clienteActivo.getDni());
		pagoPrestamo.setFecha(date);
		
		if(req.getParameter("idCuenta")!= null)
			pagoPrestamo.setNroCuenta(RequestConverterUtils.convertLong(req, "idCuenta"));
		
		if(req.getParameter("formaPago")!= null)
			pagoPrestamo.setOrigen(OrigenFondos.obtenerOrigenFondos(req.getParameter("formaPago")));
		
		tipoPago = RequestConverterUtils.convertInteger(req, "tipoPago");
		
		return devolver;
	}
}
